// Object.create( proto [, properties] )
// 作用: 用于创建一个新的对象(即实例)，新对象以proto为原型，也可以为新对象设置属性
// 返回: 返回新创建的对象(即实例)

// 用"对象字面量"创建一个用作原型的实例
const proto = {
    kind: '兽类',
    show() {
        console.log(`这是${this.kind}动物`);
    }
}

const properties = {
    name: { value: '大熊猫', enumerable: true },
    introduce: { 
        value: function(){
            console.log(`我是${this.name}`);
        }
    }
};

// 以proto为原型创建一个新的实例并为其配置属性
let instance = Object.create( proto, properties );
// 调用自身方法
instance.introduce();
// 调用从原型继承的方法
instance.show();

let p = Object.getPrototypeOf( instance );
console.log( p === proto ); // true

console.log( Object.getOwnPropertyDescriptors( instance ) );

// 以 proto 为原型创建一个空对象(即没有任何属性的实例)
let x = Object.create(proto);
console.log( Object.getOwnPropertyNames(x) );
console.log( x );
x.show(); // 调用从原型继承的方法
console.log( Object.getPrototypeOf(x) === proto );

// 创建一个纯对象(pure object): 因为该对象没有原型所以它没有继承任何属性
let pure = Object.create( null );
console.log( Object.getPrototypeOf( pure ) );
try {
    // 因为引用变量pure指向的实例没有原型，所以它并没有从 Object.prototype 继承任何属性
    console.log( pure.toString() );
} catch(e) {
    console.log( e.name, e.message );
}

let t = Object.create(null, properties);
console.log( t );